home *** CD-ROM | disk | FTP | other *** search
/ Sprite 1984 - 1993 / Sprite 1984 - 1993.iso / src / lib / c / time / RCS / timezone.c,v < prev   
Text File  |  1988-07-02  |  3KB  |  135 lines

  1. head     1.1;
  2. access   ;
  3. symbols  ;
  4. locks    ; strict;
  5. comment  @ * @;
  6.  
  7.  
  8. 1.1
  9. date     88.07.02.14.54.28;  author ouster;  state Exp;
  10. branches ;
  11. next     ;
  12.  
  13.  
  14. desc
  15. @@
  16.  
  17.  
  18.  
  19. 1.1
  20. log
  21. @Initial revision
  22. @
  23. text
  24. @/*
  25.  * Copyright (c) 1987 Regents of the University of California.
  26.  * All rights reserved.
  27.  *
  28.  * Redistribution and use in source and binary forms are permitted
  29.  * provided that this notice is preserved and that due credit is given
  30.  * to the University of California at Berkeley. The name of the University
  31.  * may not be used to endorse or promote products derived from this
  32.  * software without specific written prior permission. This software
  33.  * is provided ``as is'' without express or implied warranty.
  34.  */
  35.  
  36. #if defined(LIBC_SCCS) && !defined(lint)
  37. static char sccsid[] = "@@(#)timezone.c    5.7 (Berkeley) 12/3/87";
  38. #endif /* LIBC_SCCS and not lint */
  39.  
  40. #include <sys/types.h>
  41. #include <sys/time.h>
  42. #include <stdio.h>
  43. #include <tzfile.h>
  44.  
  45. /*
  46.  * timezone --
  47.  *    The arguments are the number of minutes of time you are westward
  48.  *    from Greenwich and whether DST is in effect.  It returns a string
  49.  *    giving the name of the local timezone.  Should be replaced, in the
  50.  *    application code, by a call to localtime.
  51.  */
  52.  
  53. static char    czone[TZ_MAX_CHARS];        /* space for zone name */
  54.  
  55. char *
  56. timezone(zone, dst)
  57.     int    zone,
  58.         dst;
  59. {
  60.     register char    *beg,
  61.             *end;
  62.     char    *getenv(), *index(), *strncpy(), *_tztab();
  63.  
  64.     if (beg = getenv("TZNAME")) {        /* set in environment */
  65.         if (end = index(beg, ',')) {    /* "PST,PDT" */
  66.             if (dst)
  67.                 return(++end);
  68.             *end = '\0';
  69.             (void)strncpy(czone,beg,sizeof(czone) - 1);
  70.             czone[sizeof(czone) - 1] = '\0';
  71.             *end = ',';
  72.             return(czone);
  73.         }
  74.         return(beg);
  75.     }
  76.     return(_tztab(zone,dst));    /* default: table or created zone */
  77. }
  78.  
  79. static struct zone {
  80.     int    offset;
  81.     char    *stdzone;
  82.     char    *dlzone;
  83. } zonetab[] = {
  84.     -1*60,    "MET",    "MET DST",    /* Middle European */
  85.     -2*60,    "EET",    "EET DST",    /* Eastern European */
  86.     4*60,    "AST",    "ADT",        /* Atlantic */
  87.     5*60,    "EST",    "EDT",        /* Eastern */
  88.     6*60,    "CST",    "CDT",        /* Central */
  89.     7*60,    "MST",    "MDT",        /* Mountain */
  90.     8*60,    "PST",    "PDT",        /* Pacific */
  91. #ifdef notdef
  92.     /* there's no way to distinguish this from WET */
  93.     0,    "GMT",    0,        /* Greenwich */
  94. #endif
  95.     0*60,    "WET",    "WET DST",    /* Western European */
  96.     -10*60,    "EST",    "EST",        /* Aust: Eastern */
  97.      -10*60+30,    "CST",    "CST",        /* Aust: Central */
  98.     -8*60,    "WST",    0,        /* Aust: Western */
  99.     -1
  100. };
  101.  
  102. /*
  103.  * _tztab --
  104.  *    check static tables or create a new zone name; broken out so that
  105.  *    we can make a guess as to what the zone is if the standard tables
  106.  *    aren't in place in /etc.  DO NOT USE THIS ROUTINE OUTSIDE OF THE
  107.  *    STANDARD LIBRARY.
  108.  */
  109. char *
  110. _tztab(zone,dst)
  111.     register int    zone;
  112.     int    dst;
  113. {
  114.     register struct zone    *zp;
  115.     register char    sign;
  116.  
  117.     for (zp = zonetab; zp->offset != -1;++zp)    /* static tables */
  118.         if (zp->offset == zone) {
  119.             if (dst && zp->dlzone)
  120.                 return(zp->dlzone);
  121.             if (!dst && zp->stdzone)
  122.                 return(zp->stdzone);
  123.         }
  124.  
  125.     if (zone < 0) {                    /* create one */
  126.         zone = -zone;
  127.         sign = '+';
  128.     }
  129.     else
  130.         sign = '-';
  131.     (void)sprintf(czone,"GMT%c%d:%02d",sign,zone / 60,zone % 60);
  132.     return(czone);
  133. }
  134. @
  135.